//二进制数转字符串。给定一个介于 0 和 1 之间的实数（如 0.72），类型为 double，打印它的二进制表达式。如果该数字无法精确地用 32 位以内的二
//进制表示，则打印“ERROR”。 
//
// 示例 1： 
//
// 
//输入：0.625
//输出："0.101"
// 
//
// 示例 2： 
//
// 
//输入：0.1
//输出："ERROR"
//提示：0.1 无法被二进制准确表示
// 
//
// 
//
// 提示： 
//
// 
// 32位包括输出中的 "0." 这两位。 
// 题目保证输入用例的小数位数最多只有 6 位 
// 
//
// Related Topics 位运算 数学 字符串 👍 149 👎 0


package LeetCode.editor.cn;

/**
 * @author ldltd
 * @date 2025-07-17 00:10:16
 * @description 面试题 05.02.二进制数转字符串
 */
public class BinaryNumberToStringLcci{
	 public static void main(String[] args) {
	 	 //测试代码
	 	 BinaryNumberToStringLcci fun=new BinaryNumberToStringLcci();
	 	 Solution solution = fun.new Solution();

	 }
	 
//力扣代码
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
		 // 10进制小数转换为二进制字符串，都是乘2取整，顺序输出
    public String printBin1(double num) {
		if (num <= 0 || num >= 1) {
			return "ERROR";
		}
		StringBuilder sb = new StringBuilder("0.");
		while (num > 0) {
			if (sb.length() >= 34) { // 32 bits for the integer part and 2 for "0."
				return "ERROR";
			}
			num *= 2;
			if (num >= 1) {
				sb.append('1');
				num -= 1;
			} else {
				sb.append('0');
			}
		}
		return sb.toString();
    }

	public String printBin2(double num) {
		StringBuilder sb = new StringBuilder("0.");
		while (sb.length() <= 32 && num != 0) {
			num *= 2;
			int digit = (int) num;
			sb.append(digit);
			num -= digit;
		}
		return sb.length() <= 32 ? sb.toString() : "ERROR";
	}
	// 10进制小数转换为二进制字符串，都是乘2取整，最多循环6次
	public String printBin(double num) {
		var bin = new StringBuilder("0.");
		for (int i = 0; i < 6; ++i) { // 至多循环 6 次
			num *= 2;
			if (num < 1)
				bin.append('0');
			else {
				bin.append('1');
				if (--num == 0)
					return bin.toString();
			}
		}
		return "ERROR";
	}

}
//leetcode submit region end(Prohibit modification and deletion)

}
